辞書に関する設定
----------------

`skk-search-prog-list' の各要素に辞書検索プログラム名、辞書名、引数をセッ
トにしたリストを埋め込むことにより、辞書ファイルの指定、検索方法、検索され
る辞書の順序などを指定することができる。`skk-search-prog-list' の具体例を
示しながら更に詳しく説明する。

     '((skk-search-kakutei-jisyo-file skk-kakutei-jisyo 10000 t)
       (skk-search-jisyo-file skk-initial-search-jisyo 10000 t)
       (skk-search-jisyo-file skk-jisyo 0 t)
       (skk-okuri-search)
       (skk-search-jisyo-file skk-large-jisyo 10000)
       (skk-search-server skk-aux-large-jisyo 10000) )

関数、`skk-search-kakutei-jisyo-file',
`skk-search-jisyo-file', `skk-okuri-search',
`skk-search-server' は辞書検索プログラムである。

`skk-search-kakutei-jisyo-file'
     「確定変換」を行なう検索プログラム。第1引数は検索対象辞書。第2引数は
     リージョンの大きさを指定する。一つの見出し語に対する変換動作に対し、
     検索対象のリージョンの大きさが第2引数に指定されたサイズより小さくなる
     まではバイナリサーチが行なわれ、最後にリニアサーチが1回行なわれる。第
     2引数に0を指定すると常にリニアサーチのみが行なわれる。第3引数は辞書を
     バッファに読み込むときにミニバッファに読み込んでいる旨のメッセージを
     出力するかどうかを指定する。検索対象の辞書ファイルはEmacsのバッファに
     読み込む。検索対象のファイルから候補を見つけると、内部変数
     `skk-kakutei-flag' を立てて、いきなり確定する(ユーザーが確定する必要
     はない)。

`skk-search-jisyo-file'
     通常の検索を行なうプログラム。個人辞書の検索や、共有辞書でサーバーを
     使わない検索を行なう場合はこのプログラムを使用する。第1引数、第2引数、
     第3引数はそれぞれ `skk-search-kakutei-jisyo-file' のそれと同じ。辞書
     ファイルはEmacsのバッファに読み込む。

`skk-okuri-search'
     自動送り処理を行なうプログラム。引数はない。個人辞書の送りありエント
     リを検索対象としているので、個人辞書のバッファを流用し、専用の辞書バッ
     ファは作らない。`skk-auto-okuri-process' の値が `nil' であれば、
     `skk-search-prog-list' に `(skk-okuri-search)' が含まれていても単に無
     視され、スキップされるので、`skk-okuri-search' を動かしたいときは必ず
     `skk-auto-okuri-process' の値を `non-nil' に設定する。

`skk-search-server'
     サーバー経由で検索するプログラム。第1引数、第2引数、第3引数はそれぞれ
     `skk-search-kakutei-jisyo-file' のそれと同じ。サーバーが使用不能にな
     ると辞書ファイルをEmacsのバッファに読み込んで検索を行なう。第2引数及
     び第3引数は、辞書ファイルをEmacsのバッファに読み込んだときのみ利用さ
     れる。

変数、`skk-kakutei-jisyo', `skk-initial-search-jisyo', `skk-jisyo',
`skk-large-jisyo', `skk-aux-large-jisyo' は辞書ファイルである。

`skk-kakutei-jisyo'
     確定変換用 (1) の辞書。候補は1つのみ許される(複数の候補を書いても良い
     が無視される)。見出し語の配置は、サイズが大きければ共有辞書と同じ配置
     (2) にしてバイナリサーチを行ない、サイズが小さければ適当な配置でリニ
     アサーチを行なうのが良い。この辞書は、標準の配布パッケージには含まれ
     ていないので、使用するのであればユーザー側で用意する必要がある。

`skk-initial-search-jisyo'
     `skk-jisyo' の前に検索を行なう辞書。`skk-jisyo' の前に検索が行なわれ
     るので `skk-jisyo' にカバーを掛け、最初に出てくる候補を操作することが
     できるので、例えば、複数の専門用語毎の辞書を用意しておいて
     `skk-initial-search-jisyo' の値を切り替えることにより、専門分野毎の専
     門用語を切り替えて入力することができて便利かもしれない。見出し語の配
     置は、サイズが大きければ共有辞書と同じ配置にしてバイナリサーチを行な
     い、サイズが小さければ適当な配置 (3) でリニアサーチを行なうのが良い。
     この辞書は、標準の配布パッケージには含まれていないので、使用するので
     あればユーザー側で用意する必要がある。

`skk-jisyo'
     個人辞書。SKKを一番最初に起動したときにファイルがなければ自動的に作ら
     れる。個人辞書より先に検索するのは、確定辞書と
     `skk-initial-search-jisyo' のみの設定とすべき。個人辞書の見出し語は、
     常に一番最近に変換された語がミニマムポイントに挿入され、その配置はラ
     ンダムなものになるので、バイナリサーチを行なってはならない。

`skk-large-jisyo'
     共有辞書。ユーザーの用途と資源に合わせて、S辞書、M辞書、L辞書の中から
     選ぶ。`skk-search-jisyo-file' と対にすることを想定した辞書ファイル。

`skk-aux-large-jisyo'
     共有辞書。ユーザーの用途と資源に合わせて、S辞書、M辞書、L辞書の中から
     選ぶ。`skk-search-server' と対にして使用することを想定した辞書ファイ
     ル。

また、`skk-search-prog-list' には含まれないが(勿論検索されない)、個人辞書
のバックアップ辞書として `skk-backup-jisyo' がある。

上記の例では、
  1. `skk-kakutei-jisyo', `skk-initial-search-jisyo', `skk-jisyo' の順に検
     索を行ない、

  2. 次に個人辞書を使って送り仮名の自動処理を行ない、

  3. その後、`skk-large-jisyo' の検索を行ない、

  4. 最後に `skk-aux-large-jisyo' にサーバー経由でアクセスしている。

もし確定辞書で候補が見つかったらそのまま自動的に確定される。1回 SPC を押す
動作に対し、プログラム側では新たな候補を見つけるまで上記の動作を進める。例
えば、

  1. 確定辞書では候補は見つけられなかったが `skk-initial-search-jisyo' に
     候補があれば、そこで一旦止まりユーザーにその候補を表示する。

  2. 更に SPC が押されると、次は個人辞書を検索する。そこで候補が見つかり、
     しかもその候補が `skk-initial-search-jisyo' で見つけた候補とは異るも
     のであったときは、そこでまた一旦止まりその候補をユーザーに表示する。
     以降、共有辞書についても同様の繰り返しを行なう。

`skk-search-prog-list' の設定方法としては、例えば `skk-large-jisyo' にS辞
書かM辞書を指定し、S辞書、M辞書はEmacsのバッファに読み込んで検索し
`skk-aux-large-jisyo' に L辞書を指定して、L辞書にはサーバー経由でアクセス
する、という選択肢もある。

また、サーバー経由のアクセスも決して遅くはないので (4) 、

     (skk-search-jisyo-file skk-large-jisyo 10000)

を削除するという選択肢もある。ちなみに辞書ファイルの値が `nil' であれば、
そのファイルを引数とした検索プログラムが`skk-search-prog-list' に指定され
ていても、その検索は行なわれない。

`skk-auto.el' をロードすると、

     (skk-okuri-search)

というリストが `skk-search-prog-list' に自動的に追加される
(`skk-auto-okuri-process' を `non-nil' に設定すると `skk-auto.el' がオート
ロードされる。)。追加される位置は、`skk-jisyo' を検索するリストの次である。
あるいは

     (skk-okuri-search)

というリストを `skk-search-prog-list' の任意の位置に明示的に指定すると、
`skk-okuri-search' を使って最初に検索したときに `skk-auto.el' がオートロー
ドされる。

`skk-server.el' をロードすると、

     (skk-search-server skk-aux-large-jisyo 10000)

というリストが `skk-search-prog-list' に自動的に追加されるあるいは
`skk-server-host' もしくは `skk-servers-list' を設定するとSKKモードを起動
したときに `skk-server.el' がオートロードされる。これらの場合、追加される
位置は、`skk-search-prog-list' の末尾である。あるいは

     (skk-search-server skk-aux-large-jisyo 10000)

というリストを `skk-search-prog-list' の任意の位置に明示的に指定すると
`skk-search-server' を使って最初に検索を行なったときに `skk-server.el' が
オートロードされる。

--------- Footnotes ---------

(1)  See 確定変換.

(2) See 共有辞書の配置.

(3) 使用頻度の高い候補から降順に配置することができればリニアサーチを
行なう場合最も効率が良いが、作業は楽ではないだろう。例えば、
`skk-initial-search-jisyo' を使って一定時間文章を書いた後
`skk-jisyo' に挿入されたエントリの内、
`skk-initial-search-jisyo' にあるものを `skk-jisyo' に挿入
されている順の配置で抜き出して `skk-initial-search-jisyo' の見出
し語の配置を変えてゆけば不可能ではないが、結構な労力になろう。

(4) Perlベースの `pskkserv' を使用すれば、DBM化された辞書にアクセスす
る時間はかなり高速な部類に入る。See pskkserv.

入力モードの一時変更
====================

日常の入力では、一般的に、かなモードを使用することが圧倒的に多いと考えられ
るが、ひらがなの中にカタカナ、全角アルファベットをちりばめて入力したい、と
いう要求も多いと考えられる。カタカナの入力にはカナモードを、全角アルファベッ
トの入力には全英モードを用いることは前述の通り (1) であるが、一時的にカナ
文字、全英文字を入力して、また、かなモードに戻ることができる。

また、アスキーファイルを見出し語として使用するために、かなモードから一時的
にアスキー文字を入力する機能が提供されている。▽モードの変種である "SKK
abbrev mode" がそれである。この機能を使用することにより、`is' => `インクリ
メンタル・サーチ'のような変換を行なうことができる。

--------- Footnotes ---------

(1)  See カナモード、全英モード.

ひらがな/カタカナの一時的入力
-----------------------------

かなモードもしくはカナモードで、`/' キー以外で一旦▽モードにして文字列を挿
入し、その文字列の末尾で `q' をタイプすることで (1) `▽'マークから `q' を
タイプしたポイントまでの文字列が変換され確定される。変換は、`▽'とポイント
間の文字列の種類 (2) をキーとして下記の規則に基づき行なわれる。

   * カタカナはひらがなへ

   * ひらがなはカタカナへ

   * 全英文字はアスキー文字へ

   * アスキー文字は全英文字へ

一例を挙げる。

     `K a t a k a n a'

     ------ Buffer: foo ------
     ▽かたかな-!-
     ------ Buffer: foo ------

     `q'

     ------ Buffer: foo ------
     カタカナ-!-
     ------ Buffer: foo ------

このトグル変換を上手く利用することにより、かなモードのまま一時的にカタカナ
を入力したり、またその逆が可能となるので、一々 `q' キーにより入力モードを
2度切り換える必要がなく、ひらがな/カタカナ混じり文を書くときには非常に便利
であろう。

全英文字とアスキー文字のトグルでの変換を行なうことができるので、少し混乱が
あるかもしれないが、全英モードやアスキーモードでは `Q' やその他の大文字に
より▽モードに入ることができないので、上記のトグル変換は行なうことができな
いので注意すること。かなモード/カナモードにおいて、既に入力された全英文字、
アスキー文字に対して上記の変換を行なうことができるのみである。

なお、上記の変換は、いずれもリージョンに対するコマンドにて行なうこともでき
る。See リージョン一括変換.

--------- Footnotes ---------

(1)  `/' キーでSKK abbrev modeに入ってしまうと `q' キー入力が `q' 文字の入力として扱われてしまう。

(2) 正確に言うと`▽'の次の位置にある文字列をもって文字種の判別を行なっ
ているので、途中で文字種類の違う文字が混在していても無視される。

全英文字の一時的入力
--------------------

`/'をタイプした後、全角アルファベットとして入力したい文字列を挿入し、その
文字列の末尾で `C-q' (1) をタイプすることで、`▽'マークから `C-q' をタイプ
したポイントまでの文字列が全角アルファベットに変換され確定される。

     `/ f i l e'

     ------ Buffer: foo ------
     ▽file-!-
     ------ Buffer: foo ------

     `q'

     ------ Buffer: foo ------
     ｆｉｌｅ-!-
     ------ Buffer: foo ------

なお、この変換を行なうために、

     file /ｆｉｌｅ/

のような辞書エントリを持つ必要がない。辞書を参照せず、アスキー文字を1文字
づつ全英文字に変換しているためである。

--------- Footnotes ---------

(1)  SKK abbrev modeに入っている。`C-q' は `skk-abbrev-map' にマッピングされたキーバインドである。See アスキー文字を見出し語とした変換.

■モードにおける文字入力
========================

かなモード/カナモードにおける入力
---------------------------------

ローマ字仮名変換ルール
......................

SKKでは、`skk-roma-kana-a', `skk-roma-kana-i', `skk-roma-kana-u',
`skk-roma-kana-e', `skk-roma-kana-o' という5つの連想リストを持ち、母音が入
力された時点で対応する連想リストを走査して入力すべきかな/カナ文字を決定す
る。

例えば、`skk-roma-kana-i' の値は、下記のようになっている。

     '(("" . ("い" . "イ"))
       ("b" . ("び" . "ビ")) ("by" . ("びぃ" . "ビィ"))
       ("ch" . ("ち" . "チ")) ("cy" . ("ちぃ" . "チィ"))
       ("d" . ("ぢ" . "ヂ")) ("dh" . ("でぃ" . "ディ"))
       ("dy" . ("ぢぃ" . "ヂィ"))
       ("f" . ("ふぃ" . "フィ")) ("fy" . ("ふぃ" . "フィ"))
       ("g" . ("ぎ" . "ギ")) ("gy" . ("ぎぃ" . "ギィ"))
       ("h" . ("ひ" . "ヒ")) ("hy" . ("ひぃ" . "ヒィ"))
       ("j" . ("じ" . "ジ")) ("jy" . ("じぃ" . "ジィ"))
       ("k" . ("き" . "キ")) ("ky" . ("きぃ" . "キィ"))
       ("m" . ("み" . "ミ")) ("my" . ("みぃ" . "ミィ"))
       ("n" . ("に" . "ニ")) ("ny" . ("にぃ" . "ニィ"))
       ("p" . ("ぴ" . "ピ")) ("py" . ("ぴぃ" . "ピィ"))
       ("r" . ("り" . "リ")) ("ry" . ("りぃ" . "リィ"))
       ("s" . ("し" . "シ")) ("sh" . ("し" . "シ"))
       ("sy" . ("しぃ" . "シィ"))
       ("t" . ("ち" . "チ")) ("th" . ("てぃ" . "ティ"))
       ("ty" . ("ちぃ" . "チィ"))
       ("v" . ("う゛ぃ" . "ヴィ")) ("w" . ("うぃ" . "ウィ"))
       ("x" . ("ぃ" . "ィ")) ("xw" . ("ゐ" . "ヰ"))
       ("z" . ("じ" . "ジ")) ("zy" . ("じぃ" . "ジィ")) )

`ち'を挿入すべく `t i' という入力を行なったとすると、最後の母音である
`i' の入力時点で、`skk-roma-kana-i' を走査することが決定される。この連想リ
ストの走査キーは、入力される仮名文字のローマ字プレフィックス (1) で、この
例では "t" となる。走査結果は、

     ("t" . ("ち" . "チ"))

となる。かなモードのときは、この結果から `cadr' (2) の"ち"を、カナモードの
ときは、`cddr' (3) の"チ"を取り出し、カレントバッファに挿入する。

`ch' や `f' などヘボン式でしか使用しないキーの割付けをやめたいときは、
`~/.emacs' や `~/.skk' に不要なセルを除いた `skk-roma-kana-i' を直接書くか、
`skk-load-hook' を利用して、下記のように書く。

     (add-hook 'skk-load-hook
               (function
                (lambda ()
                  (setq skk-roma-kana-i
                        (delq (assoc "ch" skk-roma-kana-i) skk-roma-kana-i)
                        skk-roma-kana-i
                        (delq (assoc "f" skk-roma-kana-i) skk-roma-kana-i) ))))

上記の

     (assoc "ch" skk-roma-kana-i)

の代りに

     ("ch". ("ち" . "チ"))

と書いても良いが、その場合は、`delq' の代りに `delete' を使用すること。

旧バージョンのSKKでは長さ2以上のプレフィックスについて
`skk-roma-kana-[aiueo]' を変更したら、対応して `skk-prefix-list' も変更す
る必要があったが、バージョン9.6ではこれを内部変数 (4) として、SKKモードを
起動する毎に自動計算するようになった。既にSKKモードになっているバッファで
`skk-roma-kana-[aiueo]' を変更した場合は、`C-x C-j' もしくは `C-x j' を2度
タイプして `skk-mode' もしくは `skk-auto-fill-mode' を起動し直す必要がある
ので注意すること。`skk-roma-kana-[aiueo]' がユーザー変数であるために、
SKK起動後にこれらの変数が変更される可能性があるので毎度計算し直すように設
計されている。

--------- Footnotes ---------

(1)  See ローマ字プレフィックス.

(2) `cdr' の `car'。

(3) `cdr' の `cdr'。

(4) 改名されて `skk-prefix-tree' という変数になった。ElibのAVL木パッ
ケージを利用したAVL木構造となっている。`skk-prefix-list' の長さは24と
結構長く、`skk-kana-input' で頻繁に参照、走査されるので
`member' による逐次走査よりもAVL木を利用したバイナリーサーチの方が有
利と判断した。

有限状態オートマトンを用いた変換
................................

ローマ字かな変換は、`skk-roma-kana-a', `skk-roma-kana-i',
`skk-roma-kana-u', `skk-roma-kana-e', `skk-roma-kana-o' という5つの連想リ
ストに従い行われることは前節で述べた通りだが、`skk-rom-kana-rule-list' に
より表現される有限状態オートマトンを用いた変換も併用される (1) 。このリス
トのディフォルト値は、下記の通りである。

     '(("nn" nil ("ン" . "ん"))
       ("n'" nil ("ン" . "ん")) )

リストの各要素は、オートマトンの状態遷移規則:

     <現在の状態, 入力, 次の状態, 出力>

を

     (現在の状態@入力 次の状態 出力)

という形のリストで表現したものである。ここで`状態'とは変換される前のローマ
字の文字列であり、`入力'は今タイプされた文字を長さ1の文字列とみなしたもの
である。`@' は文字列の連接を表わす。`出力'は次の状態に遷移するときにバッファ
に挿入される文字列のリストであり、かなモードでは当該リストの `car'、カナモー
ドでは `cdr' がバッファに挿入される。「次の状態」が `nil' のときには最終状
態に遷移し、ローマ字かな変換を終了する。

従い、上記のディフォルト値は、`nn' または `n'' をタイプすると、かなモード
では`ん'が、カナモードでは`ン'がカレントバッファに挿入されることを示してい
る。また、

     (setq skk-rom-kana-rule-list
           '(("nn" "n" ("ン" . "ん"))
             ("n'" nil ("ン" . "ん")) ))

とすれば、

     hannou ==> はんのう
     han'ou ==> はんおう

のようにローマ字かな変換が行われる。ところで、

     ohsaka ==> おおさか
     ohta ==> おおた
     ohhira ==> おおひら

のように `oh' は特別に処理される。従い、`ohhonn' とタイプすると`おおほん
'となり`おっほん'とはならない。

     ohhonn ==> おっほん

のように変換したければ、規則

     ("oh" "h" ("" . ""))

を追加する。

この他、

     tp ==> 東北大学
     skk ==> skk
     skK ==> SKK

といった変換も、

     ("tp" nil ("東北大学" . "東北大学"))
     ("sk" "sk" ("" . ""))
     ("skk" nil ("skk" . "skk"))
     ("skK" nil ("SKK" . "SKK"))

のような規則を追加すれば可能である。自分の名前を入力することはよくあるので、
適当な省略形を用いて、このリストに追加しておくと便利かもしれない。

更に `skk-rom-kana-rule-list' を用いればT-codeやTUT-codeによる日本語入力を
実現することもできる。この場合はルールの数が数千になり、このままではルール
へのアクセスに多くの時間を要するようになる。このようにルールの数が多いとき
は、以下のようにしてあらかじめルールのリストを木の形にコンパイルしておくと
効率が良い。

  1. まず、`.emacs' などに下記のフォームを追加する。

          (setq skk-rom-kana-rule-tree
                (skk-compile-rule-list skk-rom-kana-rule-list) )

  2. このままではSKKを起動するときに毎回 `skk-compile-rule-list' を計算す
     ることになるので、うまくゆくことが分れば、上記のフォームに代えて、

          (skk-compile-rule-list skk-rom-kana-rule-list)

     の値を直に `~/.emacs' などに書いておく。

--------- Footnotes ---------

(1)  順序としては、オートマトンの状態遷移規則を用いたリストが先に参照され、そこに該当の規則がなければ、次に上記5リストが参照される。

数字や記号文字の入力
....................

かなモード/カナモードにおける次のキーは、`skk-self-insert' 関数にバインド
されている。

     !  #  %  &  '  *  +

     -  0  1  2  3  4  5

     6  7  8  9  :  ;  <

     =  >  ?  "  (  )  [

     ]  {  }  ^  _  `  |

     ~

これらの数字や記号文字のキーに対応し挿入される文字は、ベクトル
`skk-input-vector' の値により決定される。`skk-input-vector' のディフォルト
値は、下記の通り。

     [nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  "！" nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  "、" "ー" "。" nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  "：" "；" nil  nil  nil  "？"
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  "「" nil  "」" nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil]

このベクトルは、キーのアスキーコード順に対応する文字列を並べたものである。
例えば `!' のアスキーコードは33で (1) 、このベクトルの33番目 (2) の要素に
は全角文字の`！'が割り振られているので、`!'のキー入力に対し、全角文字であ
る`！'がバッファに挿入される。

要素が `nil' のところは使用されないか、または入力キーがそのまま挿入される
ことを示している。具体例を言えば、▽モードへ入るキーの1つに `A' があるが、
このキーは、`skk-set-henkan-point' に割り付けられており (3) 、
`skk-input-vector' では参照されないので、`A' のアスキーコードである65番目
の要素は `nil' である。また、`*' は、前述の通り `skk-self-insert' に割り付
けられているが、そのアスキーコードは42であり、`skk-input-vector' の42番目
の要素は `nil' なので、そのまま `*' が挿入される。

あるインデックスに対するベクトルの要素を簡単に調べるには、Emacsの組み込み
関数である `aref' を使い、

     (aref skk-input-vector 33)

のようにする。返り値が対応する値である。

かなモード/カナモードで `*' にて対応し全角文字の`＊'を入力したければ、
`~/.skk' `~/.emacs' に42番目の要素が全角文字の"＊"であるような
`skk-input-vector' を直接書いておくか、 `~/.skk' や `skk-load-hook' を利用
して下記のような式を評価する (4) 。

     (aset skk-input-vector 42 "＊")

バッファに依存して異なる `skk-input-vector' を用いるには、バッファローカル
な同名の変数を作り、その変数の値の設定を変更すればよい (5) 。例えば、下記
の関数をあるバッファで実行すれば、そのバッファでは区切記号 `!', `,',
`.', `:', `;', `?' の各キー入力に対して、対応するアスキー文字をそのまま入
力できるようになる (6) 。

     (defun skk-ascii-punc ()
       "use ascii punctuation marks."
       (interactive)
       (make-local-variable 'skk-input-vector)
       (setq skk-input-vector
             (copy-sequence (default-value 'skk-input-vector)))
       (aset skk-input-vector ?! nil)
       (aset skk-input-vector ?, nil)
       (aset skk-input-vector ?. nil)
       (aset skk-input-vector ?: nil)
       (aset skk-input-vector ?; nil)
       (aset skk-input-vector ?? nil) )

Emacsのモード固有のフックなどを利用して上記のような関数を実行すれば、モー
ドに依存して自動的に `skk-input-vector' をカスタム化できる。

`skk-self-insert' は、Emacsのオリジナル関数である `self-insert-command' を
エミュレートしているので、引数を渡すことにより同じ文字を複数、一度に挿入す
ることが可能である (7) 。

     `C-u 2 !'

     ------ Buffer: foo ------
     ！！
     ------ Buffer: foo ------

--------- Footnotes ---------

(1)  `!' をEmacsのchartypeで表現した `?!' をEmacsの `lisp-interaction-mode' で評価すると33が返ってくる。

(2) 0から数える。

(3) `A'をタイプすると`あ'を挿入する他、▽モードに入る、という仕
事をしなければならないので、`skk-self-insert' ではなく、
`skk-set-henkan-point' に割り付けられている。

(4) `aset' の第2引数の42の代りに `?*' のように `*' のchar
type表現をそのまま書いても良い。`aset' を使って
`skk-input-vector' の値を変更するのは、`skk.el' のロード後でなけ
ればならないので、この式を `.emacs' などで設定してはならない

(5) `skk-input-vector' が元々グローバル変数であることに注意。

(6) 初期値が `nil' でないバッファローカル値に破壊的関数を使用すると、
カレントバッファだけでなく、他のバッファから見える値まで変更されてしまう。
詳細については、`skk.el' の `skk-make-henkan-marker'関数のコメン
トを参照願いたい。`skk-ascii-punc' では、初期値が`nil'でない
`skk-input-vector' をバッファローカル化し、`aset' で直接書換えす
るので、予め `copy-sequence' で複写し、バッファローカル化された
`skk-input-vector' が指す実体をグローバル変数
`skk-input-vector' の指すものから変更している。

(7) 残念ながら、`あ'などを入力する `skk-insert-[aiue]' や
`▽あ' などを入力する `skk-set-henkan-point' では引数渡しできな
い。

全英モードにおける入力
----------------------

全英モードにおける印字可能な全てのキーは `skk-zenkaku-insert' に割り付けら
れており `skk-zenkaku-vector' の値により挿入される文字が決定される。
`skk-zenkaku-vector' のディフォルト値は、下記の通り。

     [nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      "　"  "！" "”" "＃" "＄" "％" "＆" "’"
      "（" "）" "＊" "＋" "，" "−" "．" "／"
      "０" "１" "２" "３" "４" "５" "６" "７"
      "８" "９" "：" "；" "＜" "＝" "＞" "？"
      "＠" "Ａ" "Ｂ" "Ｃ" "Ｄ" "Ｅ" "Ｆ" "Ｇ"
      "Ｈ" "Ｉ" "Ｊ" "Ｋ" "Ｌ" "Ｍ" "Ｎ" "Ｏ"
      "Ｐ" "Ｑ" "Ｒ" "Ｓ" "Ｔ" "Ｕ" "Ｖ" "Ｗ"
      "Ｘ" "Ｙ" "Ｚ" "［" "＼" "］" "＾" "＿"
      "‘" "ａ" "ｂ" "ｃ" "ｄ" "ｅ" "ｆ" "ｇ"
      "ｈ" "ｉ" "ｊ" "ｋ" "ｌ" "ｍ" "ｎ" "ｏ"
      "ｐ" "ｑ" "ｒ" "ｓ" "ｔ" "ｕ" "ｖ" "ｗ"
      "ｘ" "ｙ" "ｚ" "｛" "｜" "｝" "〜" nil]

挿入される文字の変更方法等については、see 数字や記号文字の入力 を参照
のこと。

`skk-zenkaku-insert' もEmacsオリジナルの関数 `self-insert-command' をエミュ
レートしている関係から、引数を渡すことにより同じ文字を複数、一度に挿入する
ことができる。`skk-self-insert' における動作と同じであるので、前述した例を
ご参照いただきたい。See 数字や記号文字の入力.

1回のadvertised-undo(undo)の対象
--------------------------------

SKKモードになっていないEmacsオリジナルバッファでは、連続する20文字の挿入が
一度のアンドゥの対象となっている。かな・カナ・全英モードにおける入力も、こ
のオリジナルの動作をエミュレートしている (1) 。正確に言えば、
`skk-insert-[aiue]', `skk-insert-comma', `skk-insert-period',
`skk-kana-input', `skk-self-insert', `skk-set-henkan-point',
`skk-zenkaku-insert' (2) の各関数にバインドされたキー入力については、連続
して入力された20文字を1つのアンドゥの対象としている (3) 。但し、上記の
SKKの関数とEmacsのオリジナルの`self-insert-command' を織り混ぜてキー入力し
た場合 (4) は、このエミュレート機能は正常に働かないので注意すること。この
エミューレート機能は、Mule-2.3添付の `egg.el' を参考にした。

     `a i u e o k a k i k u k e k o s a s i s u s e s o t a t i t u t e t o'

     ------------------------- Buffer: foo -------------------------
     あいうえおかきくけこさしすせそたちつてと ; 連続する20文字。
     ------------------------- Buffer: foo -------------------------

     `C-_'

     ------------------------- Buffer: foo -------------------------
                            ; 20文字全てがアンドゥの対象となる。
     ------------------------- Buffer: foo -------------------------

     `a i u e o k a k i k u k e k o s a s i s u s e s o t a t i t u t e t o n a'

     -------------------------- Buffer: foo --------------------------
     あいうえおかきくけこさしすせそたちつてとな ; 連続する21文字。
     -------------------------- Buffer: foo --------------------------

     `C-x u'

     -------------------------- Buffer: foo --------------------------
     あいうえおかきくけこさしすせそたちつてとな ; 最後の1文字のみがアンドゥの対象となる。
     -------------------------- Buffer: foo --------------------------

--------- Footnotes ---------

(1)  `buffer-undo-list' にEmacsが挿入したアンドゥの境目の目印を取り除く方法でエミュレートしている。

(2) SKK abbrevモードでは、アスキー文字入力がEmacsオリジナルの
`self-insert-command' により行なわれているので、エミュレートのための
内部変数である `skk-self-insert-non-undo-count' をインクリメントする
ことができず、アンドゥをエミュレートできない。しかも、カンマやピリオドを挿
入した時点で、`skk-abbrev-comma' や `skk-abbrev-period' を使うこ
とになるので、オリジナルのアンドゥの機能も損なってしまう。ただ、現実問題と
しては、元来SKK abbrevモードは省略形としての見出し語を挿入するためのモード
であるので、長い見出し語を挿入することはあまりなく、問題も小さいと考えられ
る。

(3) `20'はEmacsのソースファイルの一部である `keyboard.c' に定められた
マジックナンバーと一致する。

(4) かなモードでの入力中、アスキーモードに移行してタイプした場合などがこれ
にあたるであろう。

対になる文字列の一括入力
------------------------

例えば、`「' を入力したら、必ずと言って良いほど `」' を後で入力する必要が
でてくる。`「' の入力時点で、対になる文字を自動挿入してくれるとタイプ数を
減らすことができ、入力忘れの防止にもなる。`skk-auto-insert-paren' の値を
`non-nil' にすると、上記の自動挿入を行なう。

     ------ Buffer: foo ------
     彼はこう言った-!-
     ------ Buffer: foo ------

     `['

     ------ Buffer: foo ------
     彼はこう言った「-!-」
     ------ Buffer: foo ------

上記のように `「' の入力時点で対となる`」'を自動挿入し、`「'と`」'の間にポ
イントを再配置するので、その位置からかぎかっこに囲まれた文字列を即始めるこ
とができる。

自動挿入すべきペア文字列は、`skk-auto-paren-string-alist' で指定する。その
ディフォルト値は下記の通り。

     '(("「" . "」") ("『" . "』") ("(" . ")") ("（" . "）") ("{" . "}")
       ("｛" . "｝") ("〈" . "〉") ("《" . "》") ("[" . "]") ("［" . "］")
       ("〔" . "〕") ("【" . "】") ("\"" . "\"") ("“" . "”") )

各リストの `car' に指定された文字列を挿入すると、`cdr' に指定された文字列
を自動挿入する。このリストの各要素の `car' に指定された文字列は、対になる
文字列の自動挿入のために、例えアスキー文字であっても `skk-input-vector' に
指定する必要があるが、この処理はSKKが内部で自動的に行なっているので、ユー
ザーが行なう必要はない。既にSKKモードになっているバッファで
`skk-auto-paren-string-alist' を変更した場合は、`C-x C-j' もしくは `C-x
j' を2度タイプして `skk-mode' もしくは `skk-auto-fill-mode' を起動し直す必
要があるので注意すること。

キーとなる文字の挿入が行なわれても、その挿入後のポイントに自動挿入すべき文
字が既に存在している場合には、自動挿入は行なわれない。

     ------ Buffer: foo ------
     -!-」
     ------ Buffer: foo ------

     `['

     ------ Buffer: foo ------
     「-!-」
     ------ Buffer: foo ------

対になる文字を複数挿入したい場合は、引数を渡して文字を指定する。具体例を述
べる。

     `C-u 2 ['

     ------ Buffer: foo ------
     「「-!-」」
     ------ Buffer: foo ------

このような場合、最初のかぎかっこに対する文章から書き始めることが多いと考え
られるので、ポイントは`「「-!-」」'ではなくて、`「-!-「」」'に再配置される
べきかもしれない。将来のバージョンにて検討する。See 拡張アイディア.

`yatex-mode' など、既に同種の機能が付いているモードがある。そのようなモー
ドにおいてもこの自動挿入の機能が邪魔になることはないと考えるが、そのモード
においてのみこの機能をオフにしたい場合は、該当のモードに入ったときにコール
されるフックを利用して設定を行なうことができる。

     (add-hook 'yatex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (set (make-local-variable 'skk-auto-insert-paren) nil)))))

特定のモードにおいて、自動挿入すべき文字を変更したい場合にも同様にフックを
用いて操作できる。

     (add-hook 'tex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (progn
                        (make-local-variable 'skk-auto-paren-string-alist)
                        (setq skk-auto-paren-string-alist
                              (cons '("$" . "$") skk-auto-paren-string-alist) ))))))

特定のペアを削除したい場合は、例えば下記のように設定する (1) 。
     (add-hook 'tex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (progn
                        (make-local-variable 'skk-auto-paren-string-alist)
                        (setq skk-auto-paren-string-alist
                              (delete
                               '("$" . "$")
                               (copy-sequence skk-auto-paren-string-alist) )))))))

--------- Footnotes ---------

(1)  何故
`copy-sequence' を使用するのかについては、
see 数字や記号文字の入力 を参照。

ポイントを戻して▽モードへ
==========================

見出し語の入力を大文字で開始することを忘れた場合の▽マークの付け方について
は前述したが (1) 、これを簡略化し、ワンアクションで行なう方法について説明
する。

`M-Q' (2) とタイプするとポイントの直前の文字列について走査し、同種の文字
(3) が続く限りbackward方向にポイントを戻して▽モードに入り、またポイントを
`M-Q' 入力時の地点に戻す。

     `k a n j i'

     ------ Buffer: foo ------
     かんじ-!-
     ------ Buffer: foo ------

     `M-Q'

     ------ Buffer: foo ------
     ▽かんじ-!-
     ------ Buffer: foo ------

変換開始ポイントの走査時には、スペース文字、タブ文字、長音を表わす`ー'は無
条件にスキップされる。但し、ひらがなの場合は`を'の直前で、カタカナの場合は
`ヲ'の直前で変換開始ポイントの走査を止め、▽モードに入る。変換開始ポイント
を`を'、`ヲ'の直前で止めるのは、文章が`事情を考慮する'のように`×××を○
○○'の形態になっており、`○○○'のみを変換の対象としたい場合が圧倒的に多
いからである。

無引数で `M-Q' を実行した場合は上記のように文字の種類によりポイントを必要
数のみbackward方向へ戻すが、明示的に戻す文字数を指定するには `C-u 5 M-Q'
のように引数を渡して実行する。この場合は文字種別を問わず、与えられた文字数
だけ無条件にポイントを戻す。

なお、backward方向にポイントを戻す途中で行頭に到達した場合は、更に上の行に
ついて行末の文字列から同様の走査を行ない、必要があれば更にポイントを戻す。
`skk-allow-spaces-newlines-and-tabs' の値を `nil' にすることで、行を超えて
の走査をやめることができる。

--------- Footnotes ---------

(1)  See ▽マークの付け忘れ.

(2) `Q' は大文字で入力する必要がある。

(3) ひらがな、カタカナ、全角アルファベット、アルファベットの4種類のいずれ
か。

確定変換とそのアンドゥ
======================

確定変換を行なうプログラム `skk-search-kakutei-jisyo-file' と 確定辞書
`skk-kakutei-jisyo' については前節で述べたが、ここではその動作について具体
的に説明する。例えば、

     せつめい /説明/

というエントリが確定辞書にあったとすると、

     `S e t u m e i'

     ------ Buffer: foo ------
     ▽せつめい
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     説明
     ------ Buffer: foo ------

のように確定動作をすることなしに(暗黙の確定もなく) いきなり確定する。仮に
確定辞書に

     じしょ /辞書/

というエントリを挿入してしまったが、`自署'に変換したい場合は、確定直後に
`x' をタイプすることにより確定変換をアンドゥして▽モードに戻ることができ、
次に SPC をタイプしたときは、確定辞書は検索を行なわないので、個人辞書、あ
るいは共有辞書に

     じしょ /自署/

のエントリがあれば`自署'への変換を行なうことができる。

     `Z i s y o SPC'

     ------ Buffer: foo ------
     辞書
     ------ Buffer: foo ------

     `x'

     ------ Buffer: foo ------
     ▽じしょ
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼自署
     ------ Buffer: foo ------

確定アンドゥ
============

一番最後に行なった変換についての確定をアンドゥして、再変換を行なうことがで
きる。これを「確定アンドゥ」という。確定変換のアンドゥと混同しないこと。

下記に例を示す。辞書エントリが

     こうこう /高校/孝行/航行/

のようになっているとする。

     `K o u k o u SPC'

     ------ Buffer: foo ------
     ▼高校
     ------ Buffer: foo ------

     `s u r u'

     ------ Buffer: foo ------
     高校する-!-
     ------ Buffer: foo ------

     `M-x skk-undo-kakutei'

     ------ Buffer: foo ------
     ▼孝行-!-する
     ------ Buffer: foo ------

`高校'の確定についてアンドゥしたので、辞書の第一候補である`高校'をスキップ
して、次候補である`孝行'の変換を行なっている。候補`孝行'について▼モードに
入ったところで、▼モードにおいて通常の変換で`孝行'を得た時点と全く同一の状
態にあるので、更に SPC を押してこの例での次候補である`航行'を変換により求
めたり、更にもう一度 SPC を押して辞書登録モードに入ることもできる。

確定した直後(上記の例では、送り仮名である`する'の入力のための `s' の入力前
) でなくともアンドゥが可能である。より正確には、次の新たな確定 (1) を行な
うまではアンドゥに関する情報が保持されているので、アンドゥが可能である。

変換、確定に関連しない文字列は、確定アンドゥを行なっても削除されない。上記
の例では、`する'がそのままカレントバッファに残っていることに注意。

--------- Footnotes ---------

(1)  `C-j' をタイプして明示的に確定した場合は勿論、
暗黙の確定を行なった場合も同様である。

見出し語関連
============

見出し語の補完
--------------

▽モードで TAB を押すと、見出し語(▽モードにおける入力文字列)に対する補完
が行われる。TAB を押す直前に▽モードで入力された文字列をσとすると、個人辞
書 (1) の送りなしエントリの中で、先頭がσと一致し長さがσよりも長い見出し
語を捜して、そのようなτがもしあれば、σの代わりにτが表示される。見出し語
の補完を上手に利用することで、タイプ数を減らすことができる。

▼モードで変換を行なった語の見出し語について、時間的に新しいものから先に補
完が行なわれる。例えば、`斉藤'、`佐藤'の順で変換した後、`さ'をキーにして見
出し語の補完を行なうと、最初に`さとう'が、その次に`さいとう'が補完される。
補完が意図したものでなかったときには TAB の直後に `.' (ピリオド)をタイプす
ると2番目の見出し語が表示される。以下同様に `.' を続けてタイプすると、見出
し語の候補が順次表示される。意図した見出し語を通りすぎたときは `,' (コンマ
)で前の候補に戻る。

     `S a t o u SPC C-j'

     ------ Buffer: foo ------
     佐藤
     ------ Buffer: foo ------

     `S a'

     ------ Buffer: foo ------
     ▽さ
     ------ Buffer: foo ------

     TAB

     ------ Buffer: foo ------
     ▽さとう
     ------ Buffer: foo ------

     `.'

     ------ Buffer: foo ------▽さいとう (2) ------ Buffer: foo ------

     `,'

     ------ Buffer: foo ------
     ▽さとう
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼佐藤
     ------ Buffer: foo ------

     `C-j'

     ------ Buffer: foo ------
     佐藤
     ------ Buffer: foo ------

なお、個人辞書の検索は、見出し語を得るために行なわれるので、一旦 SPC をタ
イプして▼モードに入れば `skk-search-prog-list' の順に候補が検索される
(`skk-search-prog-list' で個人辞書の前に検索を行なうように設定されている検
索もスキップせずに行なう)。例えば、`skk-search-prog-list' で確定変換を行な
う設定を行なっており、確定辞書にその見出し語があれば、見出し語を補完した際
にも確定変換が行なわれる。

`skk-dabbrev-like-completion' の値を `non-nil' にすることで、`.' で2番目以
降の補完を行なったときに、最初に補完された語について補完が行われる。つまり
上記の例では`さ'に対し、最初に補完された語は、`さとう'であるので、以後の補
完は、`さとう'を含む語(例えば、`さとうせんせい'など) について行なわれる。

--------- Footnotes ---------

(1)  共有辞書はサーチされない。共有辞書では一般
的に先頭の文字を共通にする見出し語が多すぎて、望みの補完が行なえる可能性
が低いからである。

(2) `さとう'の次に補完される見出し語は、個人辞書の内容に依存する。

見出し語を補完しながら▼モードへ
--------------------------------

前節で見出し語の補完について述べたが、その見出し語の補完動作を行なった後、
SPC をタイプし、▼モードに入るまでの動作をワンアクションで行なうことができ
る。補完される見出し語が予め把握できている状況では、キータイプがワンアクショ
ン省略できる。長い見出し語の専門用語を連続して入力する場合などに威力を発揮
する。

     `K a s i t a n n p o s e k i n i n n'

     ------ Buffer: foo ------
     ▽かしたんぽせきにん
     ------ Buffer: foo ------

     SPC, RET

     ------ Buffer: foo ------
     瑕疵担保責任
     ------ Buffer: foo ------

     `K a'

     ------ Buffer: foo ------
     ▽か
     ------ Buffer: foo ------

     `M-SPC'

     ------ Buffer: foo ------
     ▼瑕疵担保責任
     ------ Buffer: foo ------

空白・改行・タブを含んだ見出し語の変換
--------------------------------------

下記のようにオートフィルモードで折り返された文字列に対し、折り返された状態
のまま変換を行なうことができる。

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムをさ
     くせいしました。-!-
     ---------------- Buffer: foo ------------------

     `C-u 10 C-b Q'

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▽-!-さ
     くせいしました。
     ---------------- Buffer: foo ------------------

     `C-u 5 C-f'

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▽さ
     くせい-!-しました。
     ---------------- Buffer: foo ------------------

     SPC

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▼作成-!-しました。
     ---------------- Buffer: foo ------------------

上記の例では改行だが、空白、タブ文字を中間に含む文字列に対しても変換を行な
うことができる。`skk-allow-spaces-newlines-and-tabs' の値を `nil' にするこ
とで2行以上にまたがる文字列に対する変換を禁止することができる。

カタカナの見出し語
------------------

`q' によりかなモード、カナモードを度々切り替えて入力を続けていると、カナモー
ドで誤って▼モードに入ってしまうことがあるので、カナモードで▼モードに入ろ
うとすると、まず見出し語をひらがなに変換するように設計されている。

更に、送りあり変換で、送り仮名もカタカナにしたい場合については、
see カナモードでの変換の送り仮名の処理 を参照のこと。

あまりないケースだとは思うが、見出し語をカタカナのまま残して変換を行ないた
い場合には SPC に代えて `C-u SPC' のように `SPC' に数値引数を渡せば良い。

送り仮名関連
============

送り仮名の厳密なマッチ
----------------------

例えば、個人辞書に

     おおk /大/多/[く/多/]/[き/大/]/

という送りありエントリがあれば `O o K i i SPC' とタイプした場合、標準では
`大きい'と`多きい'という 2 通りの候補が出力可能であるが、この内`多きい'を
選択することは有り得ない。送りあり変換で、見出し語が同じ文字列であっても選
択する可能性のある候補とない候補が混在している場合が多く、更に候補の絞り込
みをしたいという要請が出てくる。

変数 `skk-henkan-okuri-strictly' の値を `non-nil' にすると、見出し語がマッ
チするかどうかのチェックの上に、送り仮名がマッチするかどうかのチェックが行
なわれ、送り仮名がマッチしない候補を出力しない。上記の場合では、送り仮名
`き'がマッチする`大きい'のみを出力し、`多きい'を出力しない。個人辞書の送り
ありエントリが充実しておれば、標準の設定よりも候補が絞り込まれるので変換効
率がアップするが、個人辞書の送りありエントリが充実していなければ、すぐに辞
書登録モードに入ってしまい逆効果となる。

このユーザーオプションは `skk-process-okuri-early' の値を
`non-nil' にした状態と共存できない。詳細は
送りあり変換の変換開始のタイミング を参照のこと。メニューバーを使用
してこのユーザーオプションをオンにすると、自動的に
`skk-process-okuri-early' の値を `nil' にすることができる。

変数 `skk-henkan-okuri-strictly' の値を `non-nil' にすると、辞書登録モード
に入っても送り仮名のマッチが厳密に行なわれるので、辞書登録時に漢字を得るの
に一苦労する羽目になる。下記のようにフックを設定することで辞書登録時のみ、
一時的に送り仮名の厳密なマッチをしないようにすることができる (1) 。

     (add-hook 'minibuffer-setup-hook
               (function
                (lambda ()
                  (if (and (boundp 'skk-henkan-okuri-strictly)
                           skk-henkan-okuri-strictly
                           (not (eq last-command 'skk-purge-jisyo)) )
                      (progn
                        (setq skk-henkan-okuri-strictly nil)
                        (put 'skk-henkan-okuri-strictly 'temporary-nil t) )))))

     (add-hook 'minibuffer-exit-hook
               (function
                (lambda ()
                  (if (get 'skk-henkan-okuri-strictly 'temporary-nil)
                      (progn
                        (put 'skk-henkan-okuri-strictly 'temporary-nil nil)
                        (setq skk-henkan-okuri-strictly t) )))))

下記のように設定できればもっと簡潔なのだが、`skk-henkan-okuri-strictly' の
値は辞書バッファで参照されるために、ミニバッファのバッファローカル値を変更
しても狙った効果は得られないので注意すること。

     (add-hook 'minibuffer-setup-hook
               (function
                (lambda ()
                  (if (and (boundp 'skk-henkan-okuri-strictly)
                           skk-henkan-okuri-strictly )
                      (set (make-local-variable 'skk-henkan-okuri-strictly)
                           nil )))))

将来のバージョンでは、これを改良し、辞書バッファでの動作に影響するユーザー
変数をバッファローカル化できるようにする予定である。See 拡張アイディア.

--------- Footnotes ---------

(1)  `minibuffer-setup-hook' と
`minibuffer-exit-hook' はEmacs 19でのみ使用可能なフック

送り仮名の自動処理
------------------

どのように変換されるか
......................

変数 `skk-auto-okuri-process' を `non-nil' にセットすると、文法的な知識を
用いない送り仮名の自動処理が行なわれる。送り仮名の最初のローマ字表現を大文
字で始める必要がない (1) という利点があるが、同時にユーザがシステムに与え
る情報が少なくなるので、意図しない変換をされる割合が増えるという欠点がある。
また下記に述べるようにこの自動処理は個人辞書に依存しているので、個人辞書の
送りありエントリが貧弱な場合は、自動処理ができない可能性が高い。ただ、
`skk-auto-okuri-process' を `non-nil' にセットしていても、送り仮名の開始位
置を大文字のキーをタイプして明示的に指定することも可能であり、かつ、送り仮
名を明示した場合の変換には影響を与えないので、送りなし変換で意図しないもの
まで拾う可能性がある他はデメリットもなく、むしろ送り仮名を正確に思い出せな
い場合に送り仮名を指定しなくとも変換できるメリットがあるので、この変数の値
を常に `non-nil' にするのも良い選択かもしれない (2) 。

例えば、 `T a t i a g e r u SPC' とタイプした場合、`たちあげる'という見出
し語に対し、送り仮名を明示されていないので、まず送りなし変換として扱い辞書
を検索する。このときは、通常の変換同様、個人辞書及び指定された共有辞書他を
検索する。通常はそのような見出し語はないので、今度は個人辞書のみを検索の対
象として、見出し語を最後尾から1文字づつ切り詰め、「切り詰めの結果残った文
字列」と、「切り捨てられた先頭の文字のローマ字プレフィックス」を連結した文
字列を送りあり変換の見出し語として、検索する。この例において検索される見出
し語の変化を追うと、

     `たちあげる' => `たちあげr' => `たちあg'
     => `たちa' => `たt'

のようになる。仮に個人辞書エントリが、

     たちあg /立ち上/[げ/立ち上/]/[が/立ち上/]/
     たt /建/断/経/立/[つ/建/断/経/立/]/[ち/建/断/経/立/]/[て/経/立/建/]/

の2つのエントリを含むとすると、見出し語を後方から順に切り詰める過程で`たち
あg'と`たt'の2つの見出し語の検索時にこれらの辞書エントリがマッチする。

次に、マッチしたエントリの各候補に対し、切り捨てられた先頭の文字を送り仮名
として取るかどうかをチェックする。`たちあg'の場合の送り仮名チェックの対象
は、切り捨てられた最初の文字の`げ'であるので、

     [げ/立ち上/]

の部分のみに注目する。また、`たt'の場合の送り仮名チェックの対象は、`ち'で
あるので、

     [ち/建/断/経/立/]

のみに注目する。もうお分りのように、マッチする見出し語に対しチェックするの
は送り仮名ブロック部分だけであり、送り仮名に対応していない全候補を含む部分
(`たt' の場合は、候補の最初の `/建/断/経/立/' の部分)は単に無視される。

送り仮名がマッチする候補`立ち上'、`建'、`断'、`経'、`立'の5つを文字列の長
さ順に昇順にソートし、それぞれの候補と該当の見出し語から切り捨てられた文字
列と連結したもの(「該当の見出し語から切り捨てられた文字列」を送り仮名とみ
なして処理している。)を、送り仮名の自動処理の最終候補として返す。上記の例
では、`立ち上げる'、`建ちあげる'、`断ちあげる'、`経ちあげる'、`立ちあげる
' の5つが最終候補である。長さ順にソートするのは、変換された部分がより長い
候補を先順位として出力するためである。上記の例の`立ち上げる'と`建ちあげる
'とでは、`立ち上げる'の方が変換された部分が長いので、`立ち上げる'を`建ちあ
げる'より先順位で出力する。

--------- Footnotes ---------

(1)  See 送り仮名の入力.

(2) 専ら補完的に自動送り処理を利用するのであれば、
`(skk-okuri-search)' を`skk-search-prog-list' の最後にもってくる
のが良いであろう。

辞書登録の際に注意すべきこと
............................

個人辞書に見出し語`わたs'についてのエントリが全くない場合、あるいは個人辞
書のエントリが

     わたs /渡/[し/渡/]/

のような送り仮名のブロックを持たない場合、`W a t a s i t a SPC' とタイプす
ると、送り仮名のマッチができないので、候補の選定ができず辞書登録モードに入
る。

     `W a t a s i t a SPC'

     ------ Buffer: foo ------
     ▼わたした
     ------ Buffer: foo ------

     ------ Minibuffer -------
     わたした-!-
     ------ Minibuffer -------

辞書登録モードで `W a t a S i t a RET' と送り仮名を明示的にタイプし、`渡し
た'と変換し登録する。この場合、登録する語の最後が平仮名で終るので、その最
後の平仮名の文字列(上記の例では、`した')が見出し語の最後と一致するかを調べ、
一致する場合には、辞書の登録を送りありエントリとして行なうのかどうかの確認
を求めてエコーエリアにプロンプトを出す (1) 。

     `W a t a S i t a'
     ------ Minibuffer -------
     わたした 渡した
     ------ Minibuffer -------

     RET

     -------------------------- Echo Area --------------------------
     Shall I register this as okuri-ari entry: わたs /渡/ ? (y or n)
     -------------------------- Echo Area --------------------------

プロンプトに対し、 `y' と回答した場合は、

     わたs /渡/[し/渡/]/

という辞書エントリが個人辞書の送りありエントリに書き込まれる。`n' で回答し
た場合は、個人辞書の送りなしエントリに

     わたした /渡した/

というエントリが書き込まれてしまうので、この例では適当でない。

送り仮名部分をローマ字プレフィックスに分解する際には、ユーザー変数
`skk-kana-rom-vector' の値が参照される。この変数のディフォルト値は、下記の
通り。

     ["x" "a" "x" "i" "x" "u" "x" "e" "x" "o" "k" "g" "k" "g" "k" "g"
      "k" "g" "k" "g" "s" "z" "s" "j" "s" "z" "s" "z" "s" "z" "t" "d"
      "t" "d" "x" "t" "d" "t" "d" "t" "d" "n" "n" "n" "n" "n" "h" "b"
      "p" "h" "b" "p" "h" "b" "p" "h" "b" "p" "h" "b" "p" "m" "m" "m"
      "m" "m" "x" "y" "x" "y" "x" "y" "r" "r" "r" "r" "r" "x" "w" "x"
      "x" "w" "n"]

このベクトルは、それぞれ下記のかな文字をそのローマ字プレフィックスで現わし
たものである。

     ぁ  あ  ぃ  い  ぅ  う  ぇ  え  ぉ  お  か  が  き  ぎ  く  ぐ
     け  げ  こ  ご  さ  ざ  し  じ  す  ず  せ  ぜ  そ  ぞ  た  だ
     ち  ぢ  っ  つ  づ  て  で  と  ど  な  に  ぬ  ね  の  は  ば
     ぱ  ひ  び  ぴ  ふ  ぶ  ぷ  へ  べ  ぺ  ほ  ぼ  ぽ  ま  み  む
     め  も  ゃ  や  ゅ  ゆ  ょ  よ  ら  り  る  れ  ろ  ゎ  わ  ゐ
     ゑ  を  ん

従い、ディフォルトでは、例えば見出し語中の送り仮名の`じ'は、`j' に、`ち'は、
`t' に、`ふ'は、`h' のローマ字プレフィックスに分解される。これらの送り仮名
のローマ字プレフィックスをそれぞれ `z'、`c'、`f' に変更したい場合は、該当
の個所を "z"、"c"、"f" とするようなベクトルを `.emacs' や `.skk' に書いて
おく。

`ありがさつき'に対し`有賀さつき'を登録したい場合は、上記と同様に辞書登録を
し、

     Shall I register this as okuri-ari entry: ありがs /有賀/ ? (y or n)

のプロンプトに対し `n' と回答する。この結果、個人辞書の送りなしエントリに
は、

     ありがさつき /有賀さつき/

というエントリが書き込まれる。

--------- Footnotes ---------

(1)  `y-or-no-p' はミニバッファを使用しているのではなく、エコー
エリアにプロンプトを表示して次の1文字を待っている。`yes-or-no-p' は
ミニバッファを使用している。

送りあり変換の変換開始のタイミング
----------------------------------

`skk-process-okuri-early' の値を `non-nil' にすることで、送りあり変換の変
換開始のタイミングを早め、送り仮名のローマ字プレフィックスの入力時点で変換
を開始することができる。

     `U g o K'

     ------ Buffer: foo ------
     ▼動k
     ------ Buffer: foo ------

送り仮名が分らないまま変換していることになるので `skk-jisyo' が送り仮名に
対応した形に成長しない。つまり`うごk /動/'のような形態のままとなる。但し、

     うごk /動/[く/動/]/[か/動/]/[け/動/]/[き/動/]/[こ/動/]/

のようなエントリが既に `skk-jisyo' にあれば、それを破壊しない (1) 。このユー
ザーオプションを `non-nil' にしてSKKモードを起動すると、両立できないオプショ
ンである下記オプションは `nil'にセットされる。

     `skk-kakutei-early', `skk-auto-okuri-process', `skk-henkan-okuri-strictly'

SKKモード起動後にこのオプションの設定を変更した場合で、カレントバッファ
では既にSKKモードに入っているときは、`C-x C-j' もしくは `C-x
j' を2回タイプしてSKKモードを起動し直すことで、これらのユーザーオプショ
ン間の衝突を調整できる。またはメニューバーからこのユーザーオプションをオ
ンにすると、自動的に上記の衝突を調整できる。
See skk-kakutei-early.
skk-auto-okuri-process.
skk-henkan-okuri-strictly.

--------- Footnotes ---------

(1) See 辞書の形式 を参照のこと。

カナモードでの変換の送り仮名の処理
----------------------------------

カナモードのまま変換を行なうと、見出し語をひらがなに変換してから辞書の検索
を行なうことは前述の通りだが(see カタカナの見出し語)、カナモードで送り
あり変換を行なうと、

     ------ Buffer: foo ------
     考えル。
     ------ Buffer: foo ------

のように送り仮名の第1文字だけが、ひらがなのまま残ってしまう。カナモードで
の変換が誤って行なわれた場合はこれで良いことが多いのだが、漢字・カナ混じり
文を書いているときは、送り仮名の第1文字もカタカナ変換された方が便利である。
`skk-convert-okurigana-into-katakana' の値を `non-nil' にすることで、カナ
モードにて送りあり変換を行なった場合、送り仮名の第1文字もカタカナに変換す
るようになる。

自動変換開始
============

▽モードで見出し語の入力中に、単語や文節の区切りとなるような文字を打鍵する
と、▽マークからポイントの直前の文字までを見出し語とし(最後に入力された文
字は見出し語には含まれない)、SPC を打鍵することなく自動的に変換を開始し▼
モードに入るようになっている (1) 。単語や文節の区切りとなるような文字列は、
`skk-auto-henkan-start-keyword-list' にて指定する。

     `K a n j i'

     ------ Buffer: foo ------
     ▽かんじ
     ------ Buffer: foo ------

     `w o'
     ------ Buffer: foo ------
     ▼漢字を
     ------ Buffer: foo ------

`skk-auto-okuri-process' を `non-nil' にして 送り仮名の自動処理(see 送り 仮名の自動処理)
を行なっている場合は、下記のような変換も可能である(辞書に
`できr /出来/[る/出来/]/' というようなエントリがあるとして)。

     `D e k i r u n n d e s u'

     ------ Buffer: foo ------
     ▽できるんです
     ------ Buffer: foo ------

     `.'
     ------ Buffer: foo ------
     ▼出来るんです。
     ------ Buffer: foo ------

`skk-auto-henkan-start-keyword-list' のディフォルト値は下記の通りである。

     '("を" "、" "。" "．" "，" "？" "」" "！" "；" "：" ")" ";"
       ":" "）" "”" "】" "』" "》" "〉" "｝" "］" "〕" "}"
       "]" "?" "." "," "!" )

この自動変換開始機能をオフにしたければ、`skk-auto-henkan-start' の値を
`nil' にする。

--------- Footnotes ---------

(1)  某メーカーのMSDOS上の
FEPの仕様を参考にした。

特殊変換
========

数値変換
--------

数をパラメータ(引数)とする語には、`４月１５日'、`第１２回'などがある。日本
語ではこれらを`四月一五日'や`第12回'、`第一二回'、`第十二回'などとも表現す
ることができるが、これらに別々の辞書見出しを与えていたのでは変換効率をダウ
ンさせる要因となる。従いSKKでは`第１２回'というような変換を行ないたい場合
には、その数字部分を `#' で置き換えた見出し語`第#回'を用いる。

これに対応する辞書のエントリとしては、例えば、

     だい#かい /第#0回/第#1回/第#2回/第#3回/

のような文字列を与える。`#' の文字に数字 `0'、`1'、`2'、`3'、`4'、`9' を加
えた文字列は、数字をタイプ別に表わしたもので、その意味は下記の通りである。

`#0'
     タイプ0。アスキー文字での数字。上記の例では `12' と変換される。

`#1'
     タイプ1。全角文字での数字。上記の例では`１２'と変換される。

`#2'
     タイプ2。漢数字で位取りなし。`5500' は`五五〇〇'と変換される。

`#3'
     タイプ3。漢数字で位取りあり。`5500' は`五千五百'と変換される。

`#4'
     タイプ4。数値再変換。見出し語中の数字そのもの (1) をキーとして辞書を
     再検索し `#4' の部分を再検索の結果の文字列で入れ替える。例を後述する。

`#9'
     タイプ9。将棋の棋譜の入力用。`全角数字 + 漢数字'に変換される。例を後
     述する。

いくつか例を述べる。辞書に

     # /#3/

というエントリがあるときに、

     `Q 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 SPC' (2)

とタイプすれば、`百兆二千三億四十万五百'と変換される (3) 。

辞書エントリ

     #m#d /#0月#0日/

に対し `/ 2 m 2 5 d SPC' とタイプすれば、`2月25日'と変換される (4) 。

辞書エントリ

     #kin /#9金/

に対し、`/ 3 4 k i n SPC' とタイプすれば、`３四金'と変換される。

辞書エントリ

     p# /#4/
     125 /東京都葛飾区/

に対し、`/ p 1 2 5 SPC' とタイプすれば、見出し語 `p125' の候補が `#4' であ
るので、見出し語の数字部分の `125' に対し辞書が再検索され、`東京都葛飾区
'と変換される。

辞書登録の例を1つ述べる。`２月２５日'を得るために、

     `Q 2 g a t u 2 5 n i t i SPC'

とタイプしたときに、辞書に見出し語

     #がつ#にち

がないときは、辞書登録時のプロンプトは、`#がつ#にち'となる。全
角数字のタイプは、`#1' なので、`２月２５日'の全角数字部分を
`#1' で置き換えた文字列`#1月#1日'をミニバッファで作り登録
する。辞書エントリは、

     #がつ#にち /#1月#1日/

となる。

なお、Emacs 19では、`skk-numeric-conversion-float-num' の値を `non-nil' に
すると、浮動小数点数を使った見出し語に対応して変換を行なう。但し、その場合
は、

     #.# /#1．#1/#0月#0日/

などの辞書見出しが使用できなくなるので、注意すること。

数値変換を行ないたくないときは、変数 `skk-use-numeric-conversion' の値を
`nil' にする。

--------- Footnotes ---------

(1)  `p125' とい
う見出し語であれば、その数値部分である `125' が再変換の見出し語とな
る。

(2) または `/ 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 SPC'。

(3) 数字を大文字で入力し始めるわけにはゆかないので `Q' または
`/' で▽モードに入る必要がある。

(4) `m' や `d' などアスキー文字を見出し語として入力したい場合は
`/' キーを最初にタイプしSKK abbrev modeで入力する必要がある。See SKK abbrev mode.

アスキー文字を見出し語とした変換
--------------------------------

"SKK abbrev mode" では、アスキー文字を見出し語とした変換を行なうことができ
る。

まず、かなモードで `/' を入力することで、見出し語入力の間一時的にこのモー
ドに入る。続けて入力する文字は、アスキー文字としてカレントバッファに挿入さ
れる。見出し語となるアスキー文字を入力し終った時点で SPC を押せば、その見
出し語についての変換が得られる。仮に、

     is /インクリメンタル・サーチ/

というようなエントリが辞書にあるとして、

     `/'

     ------ Buffer: foo ------
     ▽
     ------ Buffer: foo ------

     `is'

     ------ Buffer: foo ------
     ▽is
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼インクリメンタル・サーチ
     ------ Buffer: foo ------

     `C-j'

     ------ Buffer: foo ------
     インクリメンタル・サーチ
     ------ Buffer: foo ------

のように変換が行なわれる。

入力したアスキー文字をそのまま全角アルファベットに変換したい場合については、
see 全角アルファベットへの変換.

今日の日付の入力
----------------

かな/カナモードで `@' をタイプすれば、今日の日付が入力される。

日付の形式は変数 `skk-date-ad' と `skk-number-style' により決定される。
`skk-date-ad' の値が `non-nil' であれば西暦で、`nil' であれば元号で表示す
る。`skk-date-ad' のディフォルト値は `nil' である。

また `skk-number-style' には下記の種類がある。

`0'
`nil'
     半角数字。`1996年7月21日(日)' のようになる。

`1'
`t'
     全角数字。`１９９６年７月２１日(日)' のようになる。

`2'
     漢数字。`一九九六年七月二一日(日)' のようになる。

上記の `1996年'、`１９９６年'、`一九九六年' の例は、いずれも
`skk-date-ad' の値が `nil' であれば `平成8年' のように元号で表示される。
`skk-number-style' のディフォルト値は、`1' である。

L辞書 (1) には, 見出し語 `today' のもとに、`skk-date-ad' と
`skk-number-style' の全ての組み合わせがプログラム実行変換機能 (2) を用いて
登録されている。従い、`/ t o d a y SPC' とタイプすれば、今日の日付が上の形
式で順次候補として表示される。

`@' による日付けの変換入力を行ないたくない場合は、`skk-mode-hook' などを利
用して、

     (add-hook 'skk-mode-hook (function (lambda () (local-unset-key "@"))) )

のようにすることにより、アスキー文字の `@' が挿入されるようになる。あるい
は、全角文字の `＠' を挿入したい場合は、

     (aset skk-input-vector 64 "＠")
     (add-hook 'skk-mode-hook
               (function (lambda ()
                           (define-key skk-map "@" 'skk-self-insert) )))

のようにする (3) 。

--------- Footnotes ---------

(1)  See L辞書.

(2) See プログラム実行変換.

(3) `aset' の第2引数の64は、Emacsのchar type `?@'を評価したとき
の数値である。`skk-input-vector' の変更方法についての詳細は、see 数 字や記号文字の入力 を参照のこと。

プログラム実行変換
------------------

辞書の候補にEmacs Lispのプログラムが書いてあれば、そのプログラムをEmacsの
機能で実行し、返り値をカレントバッファに挿入する。これを「プログラム実行変
換」という。例えば、辞書に

     now /(current-time-string)/

というエントリがあるときに `/ n o w SPC' とタイプすれば、カレントバッファ
には `current-time-string' の返値である

     Sun Jul 21 06:40:34 1996

のような文字列が挿入される。

実行変換プログラムの返り値は文字列である必要がある。プログラム実行変換の辞
書登録は通常の単語と同様に行なうことができるが、その中に改行を含んではなら
ない。 (1) 。

今日の日付の入力 (2) で説明した `today' の辞書エントリは下記のような実行変
換プログラムとなっている。

     today /(let ((skk-date-ad) (skk-number-style t)) (skk-today))/.../

`skk-gadget.el' (3) には、西暦/元号変換プログラムや、簡単な計算プログラム
など、実行変換プログラムが集められている。その中の1つを説明する。下記は、
引数としてoperatorを取り、見出し語の数字に対しその演算を行なう簡単な計算プ
ログラムである。

     (defun skk-calc (operator)
       ;;2つの引数を取って operator の計算をする。
       ;;注意: '/ は引数として渡せないので (defalias 'div '/) などとし、別の形で
       ;;skk-calc に渡す。
       ;;辞書見出し例; #*# /(skk-calc '*)/
       (int-to-string (apply operator (mapcar 'string-to-int skk-num-list))) )

数値変換 (4) で説明した通り、見出し語における数字は `#' で表わして辞書登録
を行なうので `111*45' のような乗算を行ないたいときは、

     #*# /(skk-calc '*)/

という辞書エントリを用意する。`Q 1 1 0 * 4 5 SPC' とタイプした
ときの `111' と `45' の2つの数字は、SKK内部では変換時に
`skk-num-list' に `("111" "45")' のように文字列のリストと
して保存される。このリストの各要素に対し乗算を行ないたいので、各要素を一
旦数値に変換し、その数値にoperatorを適用し、その結果を文字列に変換して返
す、という作業を行なっている。

--------- Footnotes ---------

(1)  通常の単語は、物理的な改行を、評価するとその位置に改
行を挿入するような実行変換プログラムに変換して辞書に書き込んでいる
(see 辞書の形式)が、実行変換プログラムは、そのプログラム中の改行だけ
を取り出して、上記のように改行を表現することができない。

(2) See 今日の日付の入力.

(3) `gadget' は「上手く工夫した道具」の意味。「色々飛び出す気のきいた
おもちゃ箱」というような意味で名付けられた。余談だが、X Windowで使用される
`Widget' という言葉は、`window'+`gadget' から作られた造語ら
しい。

(4) See 数値変換.

接頭辞・接尾辞
==============

辞書の見出し語の一部に `>', `<', `?' を用いることにより接頭辞(prefix)、接
尾辞(suffix)の入力をサポートしている。例えば、辞書に

     >し /氏/

というエントリーがあるとき、`小林氏'を接尾辞入力を用いて、以下のように入力
することができる(-!-はポイントを表わす)。

     `K o b a y a s h i'

     ------ Buffer: foo ------
     ▽こばやし-!-
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼小林-!-
     ------ Buffer: foo ------

     `>'

     ------ Buffer: foo ------
     小林▽>-!-
     ------ Buffer: foo ------

     `s i'

     ------ Buffer: foo ------
     小林▽>し-!-
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     小林▼氏-!-
     ------ Buffer: foo ------

     `C-j'

     ------ Buffer: foo ------
     小林氏-!-
     ------ Buffer: foo ------

このように入力することで、見出し語`し'に対応する語で、接尾辞になり得ないも
のを候補に入れずに辞書が構成可能になるので、候補の絞り込みの点で有利である。
同様に辞書に

     ちょう> /超/

というエントリーがあるとき、`超大型'を接頭辞入力を用いて以下のように入力す
ることができる。

     `T y o u'

     ------ Buffer: foo ------
     ▽ちょう-!-
     ------ Buffer: foo ------

     `>'

     ------ Buffer: foo ------
     ▼超-!-
     ------ Buffer: foo ------

     `O o g a t a'

     ------ Buffer: foo ------
     超▽おおがた-!-
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     超▼大型-!-
     ------ Buffer: foo ------

     `C-j'

     ------ Buffer: foo ------
     超大型-!-
     ------ Buffer: foo ------

接頭辞・接尾辞の入力の指定に使用するキーは、
`skk-special-midashi-char-list' の値を変更することによりカスタマイズできる。
この変数のディフォルト値は、

     (?> ?< ??)

である。`?' をタイプした時点で接頭辞・接尾辞入力に移行するのではなく、全角
文字`？'を挿入したい場合には `?' を `skk-special-midashi-char-list' から外
して

     (setq skk-special-midashi-char-list '(?> ?<))

とする。

暗黙の確定のタイミング
======================

標準の設定では、▼モードにおいて印字可能な文字または RET をタイプすると、
暗黙の確定が行なわれ直ちに確定する。具体的には下記のようになる。

     `K a k u t e i'

     ------ Buffer: foo ------
     ▽かくてい
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼確定
     ------ Buffer: foo ------

     `s'

     ------ Buffer: foo ------
     確定s
     ------ Buffer: foo ------

     `u'

     ------ Buffer: foo ------
     確定す
     ------ Buffer: foo ------

`skk-kakutei-early' の値を `non-nil' にすることで、暗黙の確定が行なわれる
タイミングを、カッコ類(`(', `)', `[', `]')や句読点(`,', `.')の入力時、次の
変換開始時(`A'から `Z' までの大文字)、あるいは RET 入力時まで後へずらすこ
とができる。

     `K a k u t e i'

     ------ Buffer: foo ------
     ▽かくてい
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼確定
     ------ Buffer: foo ------

     `s'

     ------ Buffer: foo ------
     ▼確定s
     ------ Buffer: foo ------

     `u r u'

     ------ Buffer: foo ------
     ▼確定する
     ------ Buffer: foo ------

     `.'

     ------ Buffer: foo ------
     確定する。
     ------ Buffer: foo ------

区切の良いところまで一気に入力しておき、後で候補を選択する、というような使
い方をするときには便利なユーザーオプションであろう。なおこのユーザーオプショ
ンは `skk-process-okuri-early' とは共存できないので、
`skk-process-okuri-early' の値を `nil' にしておく必要がある。メニューバー
からこのユーザーオプションをオンにしたときは、これらのユーザーオプション間
の衝突は自動的に調整される。

リージョン一括変換
==================

下記のコマンドを `M-x' により呼ぶことでリージョン一括変換を行なうことがで
きる。変換の種類と対応するコマンドは以下の通り。

カタカナをひらがなへ変換。
     `M-x skk-hiragana-region'

ひらがなをカタカナへ変換。
     `M-x skk-katakana-region'

全英文字をアスキー文字へ変換。
     `M-x skk-ascii-region'

アスキー文字を全英文字へ変換。
     `M-x skk-zenkaku-region'

漢字をひらがなへ変換。
     `M-x skk-gyakubiki-region' 具体的な変換例をあげると、

          "漢字をひらがなへ変換。" ==> "かんじをひらがなへへんかん。"

     のようになる。引数を渡して、`C-u M-x skk-gyakubiki-region' のようにす
     ることで、複数の候補がある場合は、`{}' でくくって表示する。例えば、

          "中島" ==> "{なかしま|なかじま}"

     のようになる。送り仮名がある語は、送り仮名まで含めてリージョンに指定
     しないと誤変換の原因となる。例えば、`五月蝿い' について、送り仮名`い
     'を含めずにこのコマンドを実行すると、`ごがつはえ' に変換されてしまう。

漢字をカタカナへ変換。
     `M-x skk-gyakubiki-katakana-region' 具体的な変換例は上記を参照のこと。
     引数を渡して、`C-u M-x skk-gyakubiki-katakana-region' のようにするこ
     とで、複数の候補がある場合は、`{}' でくくって表示する。

漢字にふりがなを付ける。
     `M-x skk-hurigana-region' 具体的には例えば、

          "漢字の脇に" ==> "漢字[かんじ]の脇[わき]に"

     のようにふりがなが振られる。引数を渡して、`C-u M-x
     skk-hurigana-region' のようにすることで、複数の候補がある場合は、
     `{}' でくくって表示する。

漢字にカタカナのふりがなを付ける。
     `M-x skk-hurigana-katakana-region' 変換例は、上記を参照のこと。引数を
     渡して、`C-u M-x skk-hurigana-katakana-region' のようにすることで、複
     数の候補がある場合は、`{}' でくくって表示する。

漢字、ひらがな、カタカナ、全英文字を全てローマ字へ変換。
     `M-x skk-romaji-region' ディフォルトでは、ローマ字への変換様式にヘボ
     ン式を用いる。例えば、

          "し" ==> "shi"

     `skk-romaji-*-by-hepburn' の値を `nil' にすると、訓令式(「日本式」と
     も言うようだ)を用いる。例えば、

          "し" ==> "si"

     昭和29年12月9日付内閣告示第一号によれば、原則的に訓令式(日本式)を用い
     るかのように記載されているが、今日一般的な記載方法は、むしろ、ヘボン
     式であるように思う。

メニューバーが使用できる環境では、メニューバーを使ってこれらの一括変換コマ
ンドを起動することができる。
See メニューバー (emacs).

上記の内、最後の5つについては、KAKASIがインストールされていなければ使用す
ることができない。See KAKASI.

また、KAKASI関連コマンドと同様の変換を行なうが、リージョンの文字列を置き換
えるのではなく、変換結果をエコーエリアに表示するコマンドがある。コマンド名
のみ紹介する。上述のリージョン一括変換コマンドの説明と下記のコマンド名から
容易に動作を想像することができるであろう。引数を渡してコールした場合の動作
も同様である。

   * `M-x skk-gyakubiki-message'

   * `M-x skk-gyakubiki-katakana-message'

   * `M-x skk-hurigana-message'

   * `M-x skk-hurigana-katakana-message'

   * `M-x skk-romaji-message'